Módulo de Gestión de Profesores
Fecha: 11 de junio de 2025 | Versión: 1.0 | Autor: Maestro Coder AI
Este documento proporciona un análisis técnico detallado del módulo de gestión de profesores del sistema OTEC. El objetivo es desglosar todos los componentes, lógicas, estructuras de datos e interacciones para permitir una comprensión profunda y la replicación exacta del módulo. El análisis se basa en los archivos form_profesor.php
, ver_profesor.php
, asignar_cursos.php
, asignar_profesor_subtema.php
y los documentos de directrices y estructura de la base de datos.
La funcionalidad del módulo de profesores se sustenta en un conjunto de tablas interrelacionadas que almacenan desde los datos personales del profesor hasta sus asignaciones y documentos.
profesores
: Tabla central que almacena la información personal y de contacto de cada profesor.profesor_documentos
: Almacena los documentos adjuntos de un profesor (CV, RUT, títulos, etc.).cursos_profesores
: Tabla de enlace que gestiona la asignación de un profesor a un curso completo. Incluye detalles administrativos y financieros de la asignación.subtemas_curso
: Aunque su propósito principal es definir el contenido de un curso, contiene el campo profesor_id
, vinculando directamente a un profesor con una clase o actividad específica.cursos_sence
: Tabla maestra de cursos, consultada para obtener los nombres y detalles de los cursos a asignar.[cursos_sence] 1--* [cursos_profesores] *--1 [profesores] | | | *--1 [profesor_documentos] | *--- [temas_curso] 1--* [subtemas_curso] *--1 [profesores] (Opcional)
profesores.id
-> profesor_documentos.profesor_id
)cursos_profesores
)profesores.id
-> subtemas_curso.profesor_id
)A continuación, se detalla la estructura y propósito de los campos clave en las tablas más relevantes para este módulo, según el fichero estructura de tablas curso sence.txt
.
profesores
Campo | Tipo | Propósito en el Módulo |
---|---|---|
id | int (PK) | Identificador único del profesor. |
rut , nombre , apellido_paterno , etc. | varchar/text/date | Datos personales y de contacto del profesor. |
cv_resumen | text | Campo para un resumen curricular del profesor. |
foto_perfil | varchar(255) | Almacena la ruta relativa al archivo de la foto de perfil. |
estado | enum('activo','inactivo') | Clave para el borrado lógico. Determina si el profesor está activo en el sistema. |
profesor_documentos
Campo | Tipo | Propósito en el Módulo |
---|---|---|
id | int (PK) | Identificador único del documento. |
profesor_id | int (FK) | Vincula el documento con un registro en la tabla profesores . |
tipo_documento | enum(...) | Clasifica el documento (RUT, curriculum, titulo, etc.). |
nombre_documento | varchar(255) | Nombre original del archivo subido. |
ruta_archivo | varchar(255) | Almacena la ruta relativa completa del archivo en el servidor. |
estado | enum('activo','inactivo') | Implementa el borrado lógico para los documentos. |
modo | enum('vigente','vencido',...) | Indica el estado de validez del documento. |
cursos_profesores
Esta tabla es fundamental para la interacción, ya que crea la relación formal entre un profesor y un curso, con todos sus detalles contractuales y financieros.
Campo | Tipo | Propósito en el Módulo |
---|---|---|
id | int (PK) | Identificador único de la asignación. |
profesor_id | int (FK) | ID del profesor asignado. |
curso_id | int (FK) | ID del curso al que se asigna el profesor. |
fecha_asignacion , remuneracion , tipo_remuneracion , forma_pago , etc. | varios | Campos administrativos y financieros que detallan las condiciones de la asignación del profesor al curso. |
modo | enum('asignado','finalizado','cancelado') | Estado operacional de la asignación. Analizado en ver_profesor.php para las estadísticas. |
estado | enum('activo','inactivo') | Campo para el borrado lógico del registro de asignación. |
form_profesor.php
)Este archivo es el corazón del módulo, manejando tanto la creación de nuevos profesores como la actualización de los existentes. El flujo es el siguiente:
$_GET['id']
. Si es así, entra en modo "Edición"; de lo contrario, está en modo "Creación".$_POST['guardar_profesor']
), se recogen todos los datos de los campos del formulario.$mysqli->real_escape_string()
antes de construir la consulta SQL. $mysqli->begin_transaction()
), garantizando la integridad de los datos. Si cualquier paso falla, se ejecuta un $mysqli->rollback()
.profesores
para obtener el $profesor_id
. Luego, se crea una estructura de directorios única.foto_perfil
en la tabla profesores
con la nueva ruta.documentos/
.profesor_documentos
para cada archivo, vinculándolo al profesor_id
.$mysqli->commit()
. Si ocurre cualquier error (lanzado como una Exception
), se captura y se revierte la transacción.asignar_profesor_subtema.php
)Este es un script de backend diseñado para ser llamado vía AJAX. Su función es crucial para la granularidad de la asignación.
subtema_id
y profesor_id
vía POST.profesor_id
es 0, se interpreta como una desasignación y se actualiza subtemas_curso.profesor_id
a NULL
.subtemas_curso.profesor_id
.cursos_profesores
).cursos_profesores
para asegurar que el profesor esté formalmente vinculado al curso general. Esto evita inconsistencias y mantiene la integridad relacional del sistema.La organización de los archivos de los profesores es fundamental para evitar colisiones de nombres y mantener un sistema ordenado. La lógica está implementada en form_profesor.php
.
Todos los archivos relacionados con un profesor se almacenan dentro de un directorio base, típicamente llamado profesor/
en la raíz del proyecto. Dentro de este, cada profesor tiene su propio directorio.
El nombre del directorio de cada profesor sigue un formato estandarizado para garantizar unicidad y fácil identificación:
profesor/{ID}_{nombre_sanitizado}_{apellido_paterno_sanitizado}/
{ID}
: Es el id
autoincremental de la tabla profesores
.{nombre_sanitizado}
y {apellido_paterno_sanitizado}
: Son las versiones del nombre y apellido procesadas por la función sanitizar_nombre()
.La función de sanitización (extraída de form_profesor.php
) convierte el texto a minúsculas, reemplaza espacios con guiones bajos y elimina caracteres especiales y acentos. Esto previene problemas con los sistemas de archivos.
Dentro del directorio de cada profesor, se crea la siguiente estructura:
/foto/
: Contiene la foto de perfil del profesor. El archivo se nombra con un timestamp para evitar problemas de caché y colisiones (ej. foto_perfil_1686502000.png
). La ruta completa guardada en profesores.foto_perfil
sería profesor/(id profesor)_(nombre profesor)_(apellido paterno profesor)/foto/foto_perfil_1686502000.png
./documentos/
: Almacena todos los documentos adjuntos. Los nombres de archivo también se hacen únicos, típicamente prefijados por el tipo de documento y un timestamp (ej. curriculum_cv_juan_perez_1686502100.pdf
). La ruta completa se guarda en profesor_documentos.ruta_archivo
./material_didactico/
: Directorio creado para futuro material didáctico que el profesor pueda subir.El sistema prioriza la integridad de los datos y el historial, por lo que implementa el borrado lógico en lugar del borrado físico (DELETE FROM ...
) en las entidades principales.
El borrado lógico se gestiona a través de una columna estado
presente en tablas clave como profesores
, profesor_documentos
, cursos_profesores
, etc. Esta columna es de tipo ENUM('activo', 'inactivo')
.
DELETE
.UPDATE
para cambiar el valor de la columna estado
de 'activo' a 'inactivo'. El formulario de edición del profesor (form_profesor.php
) incluye un campo de selección para cambiar este estado.ver_profesor.php
o listados generales) deben incluir una cláusula WHERE estado = 'activo'
para mostrar únicamente los registros válidos.El borrado lógico de un profesor tiene implicaciones en cascada que deben ser manejadas por la lógica de la aplicación, ya que las restricciones ON DELETE CASCADE
de la base de datos no se activan.
inactivo
:
cursos_profesores
): Las asignaciones existentes a cursos no se eliminan, pero al consultar los profesores de un curso, se debe hacer un JOIN
con la tabla profesores
y filtrar por profesores.estado = 'activo'
. Esto efectivamente "oculta" la asignación sin perder el historial.subtemas_curso
): De manera similar, aunque el profesor_id
permanezca en la tabla subtemas_curso
, las interfaces que muestren el profesor de un subtema deben verificar el estado de dicho profesor.profesor_documentos
): Los documentos del profesor permanecen en la base de datos pero se vuelven inaccesibles a través de la interfaz del profesor.unlink()
) SÍ se realiza cuando se elimina un documento específico a través de la interfaz de form_profesor.php
o cuando se reemplaza la foto de perfil. Este es un punto a considerar, ya que es una excepción a la regla del borrado lógico puro, pero es necesario para la gestión del almacenamiento.
La interfaz sigue las directrices generales del sistema para mantener la consistencia visual y de experiencia de usuario.
Los colores utilizados se basan en la paleta definida en directrices.txt
, que se corresponde con los colores estándar de Bootstrap para una rápida implementación.
form_profesor.php
, se dividen en secciones lógicas utilizando una div
con la clase .form-section
. Cada sección tiene un encabezado distintivo (.section-title
) con el color primario de fondo..btn-fixed-group
, que los posiciona de forma fija en la esquina inferior derecha de la pantalla para un acceso constante. .required
a su label
, la cual agrega un asterisco rojo. ver_profesor.php
): La ficha de un profesor utiliza un diseño de "tarjeta de perfil" con una cabecera prominente (.profile-header
) que muestra la foto, nombre, especialidad y estado. La información detallada se organiza en pestañas (Datos Personales, Documentos, Cursos Asignados) para una navegación limpia.El módulo incorpora varias medidas de seguridad para proteger la integridad de los datos y prevenir ataques comunes.
$mysqli->real_escape_string()
en todas las entradas de usuario antes de incluirlas en consultas SQL.